K8s[控制器]-Job
K8s[控制器]-Job
什么是Job
Kubernetes中的 Job 对象将创建一个或多个 Pod,并确保指定数量的 Pod 可以成功执行到进程正常结束:
- 当 Job 创建的 Pod 执行成功并正常结束时,Job 将记录成功结束的 Pod 数量
- 当成功结束的 Pod 达到指定的数量时,Job 将完成执行
- 删除 Job 对象时,将清理掉由 Job 创建的 Pod
创建一个 Job 对象用来确保一个 Pod 的成功执行并结束。在第一个 Pod 执行失败或者被删除(例如,节点硬件故障或机器重启)的情况下,该 Job 对象将创建一个新的 Pod 以重新执行。
Example:
|
Controlling Parallelism 并发控制
并发数 .spec.parallelism
可以被设置为0或者任何正整数,如果不设置,默认为1,如果设置为 0,则 Job 被暂停,直到该数字被调整为一个正整数。
实际的并发数(同一时刻正在运行的 Pod 数量)可能比设定的并发数 .spec.parallelism
要大一些或小一些,不一定严格相等,主要的原因有:
- 对于 fixed completion count Job,实际并发运行的 Pod 数量不会超过剩余未完成的数量。如果
.spec.parallelism
比这个数字更大,将被忽略 - 对于 work queue Job,任何一个 Pod 成功执行后,将不再创建新的 Pod (剩余的 Pod 将继续执行)
- Job 控制器可能没有足够的时间处理并发控制
- 如果 Job 控制器创建 Pod 失败(例如,ResourceQuota 不够用,没有足够的权限等)
- 同一个Job中,在已创建的 Pod 出现大量失败的情况下,Job 控制器可能限制 Pod 的创建
- 当 Pod 被优雅地关闭时(gracefully shut down),需要等候一段时间才能结束
Job的终止和清理
当 Job 完成后:
- 将不会创建新的 Pod
- 已经创建的 Pod 也不会被清理掉。此时,您仍然可以继续查看已结束 Pod 的日志,以检查 errors/warnings 或者其他诊断用的日志输出
- Job 对象也仍然保留着,以便您可以查看该 Job 的状态
- 由用户决定是否删除已完成的 Job 及其 Pod
- 可通过
kubectl
命令删除 Job - 删除 Job 对象时,由该 Job 创建的 Pod 也将一并被删除
- 可通过
Job 通常会顺利的执行下去,但是在如下情况可能会非正常终止:
- 某一个 Pod 执行失败(且
restartPolicy=Never
) - 或者某个容器执行出错(且
restartPolicy=OnFailure
)- 此时,Job 按照 处理Pod和容器的失败 中
.spec.bakcoffLimit
描述的方式进行处理 - 一旦重试次数达到了
.spec.backoffLimit
中的值,Job 将被标记为失败,且尤其创建的所有 Pod 将被终止
- 此时,Job 按照 处理Pod和容器的失败 中
- Job 中设置了
.spec.activeDeadlineSeconds
。该字段限定了 Job 对象在集群中的存活时长,一旦达到.spec.activeDeadlineSeconds
指定的时长,该 Job 创建的所有的 Pod 都将被终止,Job 的 Status 将变为type:Failed
、reason: DeadlineExceeded
:star:Job的自动清理
除了 CronJob 之外,TTL 机制是另外一种自动清理已结束Job(Completed
或 Finished
)的方式:
- TTL 机制由 TTL 控制器 提供
- 在 Job 对象中指定
.spec.ttlSecondsAfterFinished
字段可激活该特性
apiVersion: batch/v1 |
字段解释 ttlSecondsAfterFinished:
- Job pi-with-ttl 的 ttlSecondsAfterFinished 值为 100,则,在其结束 100 秒之后,将可以被自动删除
- 如果 ttlSecondsAfterFinished 被设置为 0,则 TTL 控制器在 Job 执行结束后,立刻就可以清理该 Job 及其 Pod
- 如果 ttlSecondsAfterFinished 值未设置,则 TTL 控制器不会清理该 Job
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Joohwan!
评论